//package com.jd.platform.gobrs.client.manager;
//
//import com.jd.platform.gobrs.client.gcache.LocalCacheFactoryOwner;
//import com.jd.platform.gobrs.client.gcache.ManualLocalCacheFactory;
//import com.jd.platform.gobrs.client.gcache.LocalCache;
//import com.jd.platform.gobrs.client.callback.ValueModel;
//import com.jd.platform.gobrs.client.core.key.manual.HotKeyPusher;
//import com.jd.platform.gobrs.client.core.key.KeyHandlerFactory;
//import com.jd.platform.gobrs.client.core.key.KeyHotModel;
//import com.jd.platform.gobrs.common.model.typeenum.KeyType;
//import com.jd.platform.gobrs.common.tool.Constant;
//
///**
// * 缓存执行器
// * @author sizegang wrote on 2020-02-24
// * @version 1.0
// */
//public class JdHotKeyStore {
//
//    private ManualLocalCacheFactory manualLocalCacheFactory = LocalCacheFactoryOwner.getManualLocalCacheFactory();
//    /**
//     * 是否临近过期
//     * 判断是否过期时间小于1秒，小于1秒的话也发送
//     */
//    private static boolean isNearExpire(ValueModel valueModel) {
//
//        if (valueModel == null) {
//            return true;
//        }
//        return valueModel.getCreateTime() + valueModel.getDuration() - System.currentTimeMillis() <= 2000;
//    }
//
//
//    /**
//     * 判断是否配置了规则 key， 如果是配置了，则发往worker
//     */
//    public static boolean isHotKey(String key) {
//        try {
//            // 如果没有配置规则 则不发往server
//            if (!inRule(key)) {
//                return false;
//            }
//            boolean isHot = isHot(key);
//            if (!isHot) {
//                HotKeyPusher.push(key, null);
//            } else {
//                ValueModel valueModel = getValueSimple(key);
//                //判断是否过期时间小于1秒，小于1秒的话也发送
//                if (isNearExpire(valueModel)) {
//                    HotKeyPusher.push(key, null);
//                }
//            }
//
//            //统计计数
//            KeyHandlerFactory.getCounter().collect(new KeyHotModel(key, isHot));
//            return isHot;
//        } catch (Exception e) {
//            return false;
//        }
//
//    }
//
//    /**
//     * 直接去 不涉及推送
//     * 从本地caffeine取值
//     */
//    public static Object get(String key) {
//        ValueModel value = getValueSimple(key);
//        if (value == null) {
//            return null;
//        }
//        Object object = value.getValue();
//        //如果是默认值也返回null
//        if (object instanceof Integer && Constant.MAGIC_NUMBER == (int) object) {
//            return null;
//        }
//        return object;
//    }
//
//    /**
//     * 判断是否是热key，如果是热key，则给value赋值
//     */
//    public static void smartSet(String key, Object value) {
//        if (isHot(key)) {
//            ValueModel valueModel = getValueSimple(key);
//            // 判断为空泽说明没有 设置规则
//            if (valueModel == null) {
//                return;
//            }
//            valueModel.setValue(value);
//        }
//    }
//
//    /**
//     * 强制给value赋值
//     */
//    public static void forceSet(String key, Object value) {
//        ValueModel valueModel = ValueModel.defaultValue(key);
//        if (valueModel != null) {
//            valueModel.setValue(value);
//        }
//        setValueDirectly(key, valueModel);
//    }
//
//    /**
//     * 获取value，如果value不存在则发往netty
//     * 只有配置了规则的key 才需要使用 此方法获取缓存值 否则不需要使用该方法
//     */
//    public static Object getValue(String key, KeyType keyType) {
//        try {
//            //如果没有为该key配置规则，就不用上报key
//            if (!inRule(key)) {
//                return null;
//            }
//            Object userValue = null;
//
//            ValueModel value = getValueSimple(key);
//
//            if (value == null) {
//                HotKeyPusher.push(key, keyType);
//            } else {
//                //临近过期了，也发
//                if (isNearExpire(value)) {
//                    HotKeyPusher.push(key, keyType);
//                }
//                Object object = value.getValue();
//                //如果是默认值，也返回null
//                if (object instanceof Integer && Constant.MAGIC_NUMBER == (int) object) {
//                    userValue = null;
//                } else {
//                    userValue = object;
//                }
//            }
//
//            //统计计数
//            KeyHandlerFactory.getCounter().collect(new KeyHotModel(key, value != null));
//
//            return userValue;
//        } catch (Exception e) {
//            return null;
//        }
//
//    }
//
//    public static Object getValue(String key) {
//        return getValue(key, null);
//    }
//
//    /**
//     * 仅获取value，如果不存在也不上报热key
//     * 在本地获取缓存， 同时也判断了是否在worker 端是否配置规则，如果未配置规则 则返回null
//     */
//    static ValueModel getValueSimple(String key) {
//        Object object = getCache(key).get(key);
//        if (object == null) {
//            return null;
//        }
//        return (ValueModel) object;
//    }
//
//    /**
//     * 纯粹的本地缓存，无需该key是热key
//     */
//    public static void setValueDirectly(String key, Object value) {
//        getCache(key).set(key, value);
//    }
//
//    /**
//     * 删除某key，会通知整个集群删除
//     */
//    public static void remove(String key) {
//        getCache(key).delete(key);
//        HotKeyPusher.remove(key);
//    }
//
//
//    /**
//     * 从本地cafine中获取 如果存在则说明已经被缓存成热点key
//     * 判断是否是热key。适用于只需要判断key，而不需要value的场景
//     */
//    public static boolean isHot(String key) {
//        return getValueSimple(key) != null;
//    }
//
//    private static LocalCache getCache(String key) {
//        return manualLocalCacheFactory.getNonNullCache(key);
//    }
//
//    /**
//     * 判断这个key是否在被探测的规则范围内
//     */
//    private static boolean inRule(String key) {
//        return manualLocalCacheFactory.getFromRuleCache(key) != null;
//    }
//}
